package ar.com.uade.administradorsiembra.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.Mineral;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class MineralMapper extends Mapper<Mineral> {	
	public MineralMapper() {
		super();
	}
	
	public boolean guardar(Mineral mineral) {		
		int resultado = 0;
		this.logger.info("Guardando el siguiente mineral: " + mineral);
		
		if(mineral.getId() == null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO mineral (codigo,nombre) VALUES(?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				
				parametros.add(mineral.getCodigo());
				parametros.add(mineral.getNombre());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					this.logger.info("Se guardo el mineral en forma exitosa.");
				} catch (SQLException e) {
					this.logger.error("Error al guardar el mineral. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el mineral. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else return this.modificar(mineral);
	}
	
	public Mineral buscarPorId(Integer id) {		
		this.logger.info("Buscando mineral por id: " + id);
		
		Mineral mineral = null;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);		
			
			String query = "select id, codigo, nombre from mineral where id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(id);
			
			ResultSet rs;
			
			try {				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());

				if(rs.next()){
					mineral = new Mineral(rs.getInt("id"), rs.getInt("codigo"), rs.getString("nombre"));
					this.logger.info("Mineral encontrado: " + mineral);			
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el mineral. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return mineral;
	}
	
	public Mineral buscarPorCodigo(Integer codigo) {	
		this.logger.info("Voy a buscar un mineral por el id: " + codigo);
		
		Mineral mineral = null;		
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "select id, codigo, nombre from mineral where codigo = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(codigo);	
			
			ResultSet rs;
			
			try {		
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());
				
				if(rs.next()){
					mineral = new Mineral(rs.getInt("id"), rs.getInt("codigo"), rs.getString("nombre"));
					this.logger.info("mineral encontrado: " + mineral);
				}		
			} catch (SQLException e) {
				this.logger.error("Error al buscar el material. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
		
		return mineral;
	}
	
	public boolean modificar(Mineral mineral) {	
		this.logger.error("Voy a modificar el mineral: " + mineral);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE mineral SET codigo = ?, nombre = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(mineral.getCodigo());
			parametros.add(mineral.getNombre());
			parametros.add(mineral.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());					
			} catch (SQLException e) {
				this.logger.error("Error al modificar el mineral. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;
	}
	
	public boolean borrar(Mineral mineral) {		
		this.logger.error("Borrando el mineral: " + mineral);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "Delete From mineral WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(mineral.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el mineral. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;
	}

	@Override
	public List<Mineral> buscarTodos() {	
		this.logger.info("Buscando todos los minerales");
		
		List<Mineral> resultado = new ArrayList<Mineral>();
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);			
			
			String query = "select id, codigo, nombre from mineral";
			List<Object> parametros = new ArrayList<Object>();
			ResultSet rs;
			
			try {
				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());
				
				while(rs.next()){
					Mineral mineral = new Mineral(rs.getInt("id"), rs.getInt("codigo"), rs.getString("nombre"));
					resultado.add(mineral);
					this.logger.info("Mineral encontrado: " + mineral);
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el mineral. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
		
		return resultado;
	}

	@Override
	public boolean guardarTodos(List<Mineral> instancia) {
		boolean resultado = false;
		
		if(instancia != null && !instancia.isEmpty()) {
			for (Mineral mineral : instancia) {
				this.guardar(mineral);
			}
		}
		
		return resultado;
	}
}
